package com.tiancheng.trade.payment.channel.bo;

import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotNull;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 统一下单数据
 *
 * @author kellen
 * @date 2024/4/15
 */
@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
public class UnifiedOrderBO extends BasePaymentBO {

    // 用户id
    private String uid;
    // 支付单号（使用支付中心的流水号）
    private String orderId;
    // 支付流水号
    private String flowId;
    // 订单中心的业务渠道
    private String businessType;
    // 实收金额
    private Integer amount;
    // 订单应收金额
    private Integer orderAmount;
    // 支付方式
    private String payWay;
    // 订单名称、描述
    private String orderName;
    // 支付场景（app/miniapp/H5/wxapp/pcweb/face-swiping/scan）
    private String payScene;
    // 时间戳（秒）
    private Long ts;
    // 用户手机号
    private String userTel;
    // 透传字段
    private String metadata;
    // 子订单数据
    private List<SubOrderBO> subOrders;
    // 子订单结算信息
    private List<UnifiedOrderSettleBO> subSettles;
    // 优惠信息（暂时按照计平侧定义，后续有统一规则再调整）
    private String spInfo;
    // 微信公众号/小程序支付时为必选
    private String openid;
    /**
     * 移动端微信appid或微信公众号appid等的标识字段
     */
    private String subAppId;
    // 扫码支付的后置页面
    private String endPage;
    // 主商户编码
    private String merchantCode;
    // 主商户名称
    private String merchantName;
    //微信优惠信息
    private String goodsTag;
    /**
     * 支付过期时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime payExpiryTime;
    /**
     * 支付成功跳转地址
     */
    private String returnUrl;

    //交易标识符,用于客户端先感知支付成功，后通知后端查询支付结果的场景
    private String transactionId;
    // 苹果支付成功返回凭证，验证的重要依据
    private String receiptData;

    @Getter
    @Setter
    public static class SubOrderBO {
        // 商户编码
        private String merchantCode;
        // 商户名称
        private String merchantName;
        // 产品编码
        private String productCode;
        /**
         * 交易中台对应的产品id
         */
        private String productId;
        // 产品名称
        private String productName;
        // 产品明细
        private String productDetail;
        // 产品数量
        private Integer productCount;
        // 子订单实收金额
        private Integer amount;
        // 子订单应收金额
        private Integer orderAmount;
        // 子订单号
        private String subOrderId;
        // 子支付流水号
        private String subFlowId;
        /**
         * 商户进件id
         */
        private Long merchantRegId;
        /**
         * 子商户号；min=8 max=32；
         */
        private String subMerchantId;
        /**
         * 企业用户号
         */
        private String enterpriseCode;
    }
}
